import { PerspectiveCamera } from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

/**
 * 控制器配置选项接口
 */
export interface ControlsOptions {
  /** 是否启用阻尼效果 */
  enableDamping?: boolean;
  /** 阻尼系数 */
  dampingFactor?: number;
  /** 是否启用缩放 */
  enableZoom?: boolean;
  /** 是否启用旋转 */
  enableRotate?: boolean;
  /** 是否启用平移 */
  enablePan?: boolean;
  /** 最小距离限制 */
  minDistance?: number;
  /** 最大距离限制 */
  maxDistance?: number;
  /** 最小垂直旋转角度 */
  minPolarAngle?: number;
  /** 最大垂直旋转角度 */
  maxPolarAngle?: number;
}

/**
 * 控制器工厂类
 * 用于创建和配置 Three.js 的各种控制器
 */
export default class ControlsFactory {
  /**
   * 创建轨道控制器
   * @param camera - 相机实例
   * @param domElement - DOM 元素，用于监听用户输入
   * @param options - 控制器配置选项
   * @returns 配置好的轨道控制器实例
   */
  public static createOrbitControls(
    camera: PerspectiveCamera,
    domElement: HTMLElement,
    options: ControlsOptions = {}
  ) {
    const controls = new OrbitControls(camera, domElement);

    // 设置默认选项
    controls.enableDamping = options.enableDamping ?? true;
    controls.dampingFactor = options.dampingFactor ?? 0.05;
    controls.enableZoom = options.enableZoom ?? true;
    controls.enableRotate = options.enableRotate ?? true;
    controls.enablePan = options.enablePan ?? true;

    // 设置距离限制
    if (options.minDistance !== undefined)
      controls.minDistance = options.minDistance;
    if (options.maxDistance !== undefined)
      controls.maxDistance = options.maxDistance;

    // 设置角度限制
    if (options.minPolarAngle !== undefined)
      controls.minPolarAngle = options.minPolarAngle;
    if (options.maxPolarAngle !== undefined)
      controls.maxPolarAngle = options.maxPolarAngle;

    return controls;
  }
}
